#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 函数声明
void S();
void B();
void C();

char str[20];
int lookahead; // 记录当前输入流
// 分析程序
void main()
{
    // 递归下降法匹配
    lookahead = 0;
    printf("输入句子：");
    scanf("%s", str);
    S(str[0]);
    if (str[lookahead] == '#') {
        printf("接受！");
        return;
    }
    printf("语法错误，长度过长，第%d个字符错误！", lookahead);
}

/**  递归下降法  **/

// 检查是否匹配
void match(char curChar)
{
    if (str[lookahead] != curChar) {
        if (str[lookahead] == '#')
            printf("语法错误，长度不足，第%d个字符错误！", lookahead);
        else
            printf("语法错误，第%d个字符%c有误，预期得到字符%c", lookahead+1, str[lookahead], curChar);
        exit(0);
    }
    lookahead += 1;
}

void S()
{
    switch (str[lookahead]) {
    case 'a':
        lookahead += 1;
        S();
        match('e');
        break;
    default:
        B();
    }
}
void B()
{
    switch (str[lookahead]) {
    case 'b':
        lookahead += 1;
        B();
        match('e');
        break;
    default:
        C();
    }
}
void C()
{
    switch (str[lookahead]) {
    case 'c':
        lookahead += 1;
        C();
        match('c');
        break;
    default:
        match('d');
    }
}